package reflect;

import java.lang.reflect.Field;

/**
 * 通过反射机制访问属性
 */
public class ReflectDemo8 {
    public static void main(String[] args) throws Exception {


        Class cls = Class.forName("reflect.Person");//获取类对象
        Object obj = cls.newInstance();//创建对象

        /*
        Field是反射对象之一，通过反射机制可以获取类中属性的信息
         */
        Field field = cls.getDeclaredField("name");//获取name属性对象
        field.setAccessible(true);//强制打开访问权限, 若不设置，则无法访问私有属性
        field.set(obj,"张三");//相当于obj.name="张三";
        String name = (String)field.get(obj);//获取name的属性值, 将获取的值赋给name, 由于name是String类型, 需要将获取obj值强转为String类型
        System.out.println("姓名:"+name);
        field.setAccessible(false);//关闭访问权限

        Field field1 = cls.getDeclaredField("age");//获取age属性对象
        field1.setAccessible(true);//强制打开访问权限
        field1.set(obj,25);//相当于obj.age=25;
        int age = (int)field1.get(obj);//获取age的属性值, 将获取的值赋给age, 由于age是int类型, 需要将获取obj值强转为int类型, 代码在运行时java已经帮我们做了拆装箱操作, 所以可以使用int接收
        System.out.println("年龄:"+age);
        field1.setAccessible(false);//关闭访问权限

        System.out.println(obj);//Person{name='张三', age=25}






    }
}
